.\" Copyright (C) 2023 Jens Axboe <axboe@kernel.dk>
.\"
.\" SPDX-License-Identifier: LGPL-2.0-or-later
.\"
.TH io_uring_prep_read_multishot 3 "September 12, 2023" "liburing-2.5" "liburing Manual"
.SH NAME
io_uring_prep_read_multishot \- prepare I/O read multishot request
.SH SYNOPSIS
.nf
.B #include <liburing.h>
.PP
.BI "void io_uring_prep_read_multishot(struct io_uring_sqe *" sqe ","
.BI "                                  int " fd ","
.BI "                                  unsigned " nbytes ","
.BI "                                  __u64 " offset ","
.BI "                                  int " buf_group ");"
.fi
.SH DESCRIPTION
.PP
The
.BR io_uring_prep_read_multishot (3)
helper prepares an IO read multishot request. The submission queue entry
.I sqe
is setup to use the file descriptor
.I fd
to start reading
into a buffer from the provided buffer group with ID
.I buf_group
at the specified
.IR offset .

.I nbytes
must be set to zero, as the size read will be given by the size of the
buffers in the indicated buffer group IO.

On files that are not capable of seeking, the offset must be 0 or -1.

If
.I nbytes
exceeds the size of the buffers in the specified buffer group, or if
.I nbytes
is
.B 0 ,
then the size of the buffer in that group will be used for the transfer.

A multishot read request will repeatedly trigger a completion event
whenever data is available to read from the file. Because of that,
this type of request can only be used with a file type that is pollable.
Examples of that include pipes, tun devices, etc. If used with a regular
file, or a wrong file type in general, the request will fail with
.B -EBADFD
in the CQE
.I res
field.

Since multishot requests repeatedly trigger completion events as data
arrives, it must be used with provided buffers. With provided buffers, the
application provides buffers to io_uring upfront, and then the kernel picks
a buffer from the specified group in
.I buf_group
when the request is ready to transfer data.

A multishot request will persist as long as no errors are encountered
doing handling of the request. For each CQE posted on behalf of this request,
the CQE
.I flags
will have
.B IORING_CQE_F_MORE
set if the application should expect more completions from this request.
If this flag isn't set, then that signifies termination of the multishot
read request.

After the read has been prepared it can be submitted with one of the submit
functions.

Available since 6.7.

.SH RETURN VALUE
None
.SH ERRORS
The CQE
.I res
field will contain the result of the operation. See the related man page for
details on possible values. Note that where synchronous system calls will return
.B -1
on failure and set
.I errno
to the actual error value, io_uring never uses
.IR errno .
Instead it returns the negated
.I errno
directly in the CQE
.I res
field.
.SH SEE ALSO
.BR io_uring_get_sqe (3),
.BR io_uring_prep_read (3),
.BR io_uring_buf_ring_init (3)
.BR io_uring_buf_ring_add (3),
.BR io_uring_submit (3)
